// src/utils/detectGame.js
const { exec } = require('child_process');
const fs = require('fs').promises;
const fsSync = require('fs');
const path = require('path');
const os = require('os');
const iconv = require('iconv-lite');
const { app } = require('electron'); // 引入Electron主进程模块

// 处理命令输出编码（GBK转UTF-8）
function execWithEncoding(command) {
  return new Promise((resolve) => {
    exec(command, { encoding: null }, (error, stdout, stderr) => {
      const stdoutUtf8 = iconv.decode(stdout, 'gbk').trim();
      const stderrUtf8 = iconv.decode(stderr, 'gbk').trim();
      resolve({ error, stdout: stdoutUtf8, stderr: stderrUtf8 });
    });
  });
}

// 检查当前是否以管理员权限运行
function isAdmin() {
  try {
    const { stdout } = require('child_process').execSync('fltmc', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
    return !!stdout;
  } catch {
    return false;
  }
}

async function findGameLog() {
  try {
    console.log('===== 开始检测游戏日志 =====');
    
    // 检查权限并提示
    if (!isAdmin()) {
      console.warn('⚠️ 当前未以管理员权限运行，可能导致进程路径获取失败！');
      // 可在此处弹出Electron对话框提示用户重启应用
      // 示例：
      // const { dialog } = require('electron');
      // dialog.showMessageBoxSync({
      //   type: 'warning',
      //   message: '请以管理员身份重启应用',
      //   detail: '获取游戏进程信息需要管理员权限'
      // });
      // return null; // 可选：强制要求管理员权限
    }

    // 保留标题中的空格（按实际窗口标题填写）
    const gameKeyword = 'Torchlight: Infinite  '; // 末尾保留两个空格
    console.log(`1. 查找窗口标题为"${gameKeyword}"的进程...`);

    // 1. 通过窗口标题获取游戏PID
    const { stdout: pidOutput } = await execWithEncoding(
      `powershell -Command "Get-Process | Where-Object { $_.MainWindowTitle -eq '${gameKeyword}' } | Select-Object -First 1 -ExpandProperty Id"`
    );
    const pid = pidOutput.trim();

    if (!pid || isNaN(pid)) {
      console.log(`未找到标题为"${gameKeyword}"的进程（可能标题空格数量不符）`);
      return null;
    }

    console.log(`找到匹配进程，PID: ${pid}`);

    // 2. 通过PID获取游戏可执行文件路径（PowerShell方式）
    const { stdout: pathOutput, stderr: pathError } = await execWithEncoding(
      `powershell -Command "(Get-Process -Id ${pid}).Path"`
    );
    
    if (pathError) console.log('路径获取警告:', pathError);
    const exePath = pathOutput.trim();

    if (!exePath) {
      console.error('❌ 无法获取游戏路径，请以管理员身份重启应用！');
      return null;
    }

    console.log('游戏可执行文件路径:', exePath);

    // 3. 计算日志路径（多组合尝试）
    const exeDir = path.dirname(exePath);
    const possibleLogPaths = [
      path.join(exeDir, 'TorchLight', 'Saved', 'Logs', 'UE_game.log'),
      path.join(exeDir, '..', 'TorchLight', 'Saved', 'Logs', 'UE_game.log'),
      path.join(exeDir, 'Saved', 'Logs', 'UE_game.log'),
      path.join(exeDir, '..', 'Saved', 'Logs', 'UE_game.log'),
      path.join(exeDir, '..', '..', 'TorchLight', 'Saved', 'Logs', 'UE_game.log')
    ];

    // 4. 检查日志路径
    for (const logPath of possibleLogPaths) {
      const absoluteLogPath = path.resolve(logPath);
      console.log('检查路径:', absoluteLogPath);
      if (await fs.access(absoluteLogPath).then(() => true).catch(() => false)) {
        console.log('✅ 找到日志文件');
        return absoluteLogPath;
      }
    }

    console.log('❌ 所有路径均未找到日志文件');
    return null;

  } catch (error) {
    console.error('检测失败:', error);
    return null;
  }
}

module.exports = { findGameLog };